﻿#include "pch.h"
#include "ChatWindow.h"
#include "Client.h"
#include "Const.h"
#include "Resource.h"

BEGIN_MESSAGE_MAP(ChatWindow, CDialog)
    ON_BN_CLICKED(IDC_BUTTON_SEND, OnButtonSendClicked)
END_MESSAGE_MAP()

/**
 * 构造方法。
 * @param callback      回调
 * @param friendName    好友名
 */
ChatWindow::ChatWindow(CWnd* callback, LPCTSTR friendName) :
    mCallback(callback),
    mFriendName(friendName) {
    CDialog::Create(IDD_CHAT_WINDOW, callback);
}

/**
 * "发送"按钮的单击响应方法。
 */
void ChatWindow::OnButtonSendClicked() {
    // 获取用户输入的聊天内容
    CString content;
    CDialog::GetDlgItemText(IDC_EDIT_INPUT, content);

    // 获取当前时间
    CString time = CTime::GetCurrentTime().Format(Const::DATE_TIME_FORMAT);

    // 显示聊天内容
    ChatInfo chatInfo(content, mFriendName, Client::GetUsername(), time);
    this->SetContent(&chatInfo);

    // 清空聊天内容编辑框
    CDialog::SetDlgItemText(IDC_EDIT_INPUT, _T(""));

    // 发送聊天内容
    mCallback->SendMessage(Const::UM_CHAT_C2S, (WPARAM)&chatInfo);
}

/**
 * 初始化事件的响应方法。
 * @return 总是 TRUE
 */
BOOL ChatWindow::OnInitDialog() {
    // 设置窗口标题
    CDialog::SetWindowText(mFriendName);

    // 设置最大输入长度
    CEdit* editInput = (CEdit*)CDialog::GetDlgItem(IDC_EDIT_INPUT);
    editInput->SetLimitText(ImProtocol::MAX_CONTENT_LEN);

    return TRUE;
}

/**
 * 设置聊天内容。
 * @param chatInfo  聊天信息
 */
void ChatWindow::SetContent(ChatInfo* chatInfo) {
    // 显示聊天内容
    CString friendName(chatInfo->mSrcUsername);
    CString time(chatInfo->mTime);
    CString content(chatInfo->mContent);
    CString show(friendName + Const::LEFT_BR + time + Const::RIGHT_BR + content + Const::WRAP);
    CDialog::GetDlgItemText(IDC_EDIT_HISTORY, content);
    content += show;
    CDialog::SetDlgItemText(IDC_EDIT_HISTORY, content);

    // 滚动到最底行
    int lines = CDialog::GetDlgItem(IDC_EDIT_HISTORY)->SendMessage(EM_GETLINECOUNT);
    CDialog::GetDlgItem(IDC_EDIT_HISTORY)->SendMessage(EM_LINESCROLL, 0, lines);
}
